from flask import Flask, g, jsonify, redirect, url_for, render_template, abort, request, current_app

# 使用蓝图对象创建路由
from info import db
from info.modules.user import user_blue
from info.utils.common import user_login_data, file_upload

# 个人中心
from info.utils.constants import USER_COLLECTION_MAX_NEWS, QINIU_DOMIN_PREFIX
from info.utils.models import UserCollection, Category, News

from info.utils.response_code import RET, error_map


@user_blue.route('/user_info')
@user_login_data
def user_info():
    # 判断用户是否登录
    user = g.user
    if not user:  # 未登录
        return redirect(url_for("home.index"))  # 此处不能进行403处理，不然退出时，找不到页面
    return render_template("news/user.html", user=user.to_dict())


# 基本资料  GET 向用户请求展示页面，POST请求获取用户数据
@user_blue.route('/base_info', methods=["GET", "POST"])
@user_login_data
def base_info():
    user = g.user
    if not user:
        return abort(403)  # 403资源不可用

    if request.method == "GET":
        return render_template("news/user_base_info.html", user=user.to_dict())

    # 如果接收到的是POST请求
    # 接收数据
    signature = request.json.get("signature")
    nick_name = request.json.get("nick_name")
    gender = request.json.get("gender")
    # 校验数据
    if not all([signature, nick_name, gender]):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    if gender not in ["MAN", "WOMAN"]:
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
    # 修改数据  设置自动提交，做过异常处理，此处只是修改数据
    user.signature = signature
    user.nick_name = nick_name
    user.gender = gender

    # 返回json数据
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])


# 修改头像
@user_blue.route('/pic_info', methods=["GET", "POST"])
@user_login_data
def pic_info():
    user = g.user
    if not user:
        return abort(403)  # 403资源不可用

    if request.method == "GET":
        return render_template("news/user_pic_info.html", user=user.to_dict())

    # POST 提交资料
    # 获取参数  获取文件信息请求用的是files
    avatar_file = request.files.get("avatar")
    # 接收数据
    try:
        file_bytes = avatar_file.read()
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 上传文件到七牛云服务器 一般会将文件单独管理起来 业务服务器 文件服务器
    try:
        file_name = file_upload(file_bytes)
        print(file_name)
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg=error_map[RET.THIRDERR])
    # 修改头像链接
    user.avatar_url = file_name
    # 返回json数据
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK], data=user.to_dict())


# 修改密码
@user_blue.route('/pass_info', methods=["POST", "GET"])
@user_login_data
def pass_info():
    user = g.user
    if not user:
        return abort(403)

    if request.method == "GET":
        # 直接返回静态页面
        return current_app.send_static_file("news/html/user_pass_info.html")

    # POST 提交资料
    # 接收数据
    old_password = request.json.get("old_password")
    new_password = request.json.get("new_password")
    # 校验密码
    if not all([old_password, new_password]):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
    # 校验旧密码
    if not user.check_passoword(old_password):
        return jsonify(errno=RET.PWDERR, errmsg=error_map[RET.PWDERR])

    # 修改密码
    user.password = new_password
    # 返回json数据
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])


# 显示收藏
@user_blue.route('/collection')
@user_login_data
def collection():
    # 判断用户是否登录
    user = g.user
    if not user:
        return abort(403)

    # 接收用户信息
    p = request.args.get("p", 1)
    # 校验参数
    try:
        p = int(p)
    except BaseException as e:
        current_app.logger.error(e)
        return abort(403)  # 资源不可用
    # 查询用户收藏的新闻   分页查询 收藏时间倒序
    try:
        pn = user.collection_news.order_by(UserCollection.create_time.desc()).paginate(p, USER_COLLECTION_MAX_NEWS)
    except BaseException as e:
        current_app.logger.error(e)
        return abort(500)
    # 类字典结构
    data = {
        "news_list": [news.to_dict() for news in pn.items],
        "total_page": pn.pages,
        "cur_page": pn.page
    }
    # 将数据传入模版渲染
    return render_template("news/user_collection.html", data=data)


# 显示新闻发布
@user_blue.route('/news_release', methods=["GET", "POST"])
@user_login_data
def news_release():
    print("登陆")
    # 判断用户是否登陆
    user = g.user
    if not user:
        return abort(403)

    # 传入模版渲染
    if request.method == "GET":
        print("进入")
        # 查询分类数据
        try:
            categories = Category.query.filter(Category.id != 1).all()
            print(categories)
        except BaseException as e:
            current_app.logger.error(e)
            return abort(500)

        # 将分类数据传入模版
        return render_template("news/user_news_release.html", categories=categories)

    # POST提交资料
    # 获取参数
    title = request.form.get("title")
    category_id = request.form.get("category_id")
    digest = request.form.get("digest")
    content = request.form.get("content")
    image_file = request.files.get("index_image")

    # 校验参数
    if not all([title, category_id, digest, content, image_file]):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
    try:
        category_id = int(category_id)
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 生成一条新闻数据(数据库中修改数据)
    news = News()
    news.title = title
    news.category_id = category_id
    news.digest = digest
    news.content = content

    try:
        img_bytes = image_file.read()
        # 使用七牛云上传图片
        file_name = file_upload(img_bytes)
        # 获取图片链接  model文件里没有拼
        news.index_image_url = QINIU_DOMIN_PREFIX + file_name
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg=error_map[RET.THIRDERR])

    # 设置其他
    news.source = "个人发布"
    news.user_id = user.id
    # 待审核状态 模型文件
    news.status = 1

    # 添加到数据库
    db.session.add(news)
    # json返回数据
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])


# 新闻列表
@user_blue.route('/news_list')
@user_login_data
def news_list():
    # 判断用户是否登录
    user = g.user
    if not user:
        return abort(403)

    # 接收用户信息
    p = request.args.get("p", 1)
    # 校验参数
    try:
        p = int(p)
    except BaseException as e:
        current_app.logger.error(e)
        return abort(403)  # 资源不可用
    # 查询用户的新闻   分页查询
    try:
        pn = user.news_list.paginate(p, USER_COLLECTION_MAX_NEWS)
    except BaseException as e:
        current_app.logger.error(e)
        return abort(500)
    # 类字典结构
    data = {
        "news_list": [news.to_review_dict() for news in pn.items],
        "total_page": pn.pages,
        "cur_page": pn.page
    }
    # 将数据传入模版渲染
    return render_template("news/user_news_list.html", data=data)


# 我的关注
@user_blue.route('/user_follow')
@user_login_data
def user_follow():
    # 判断用户是否登录
    user = g.user
    if not user:
        return abort(403)

    # 接收用户信息
    p = request.args.get("p", 1)
    # 校验参数
    try:
        p = int(p)
    except BaseException as e:
        current_app.logger.error(e)
        return abort(403)  # 资源不可用
    # 查询用户关注的新闻作者   分页查询
    try:
        pn = user.followed.paginate(p, USER_COLLECTION_MAX_NEWS)
    except BaseException as e:
        current_app.logger.error(e)
        return abort(500)
    # 类字典结构
    data = {
        "author_list": [author.to_dict() for author in pn.items],
        "total_page": pn.pages,
        "cur_page": pn.page
    }
    # 将数据传入模版渲染
    return render_template("news/user_follow.html", data=data)



